package com.hospital.common.base;


import com.hospital.common.enums.ResultStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一返回结果类
 * <br>记录业务状态码、业务信息、业务数据
 * <br>提供统一成功、失败方法
 *
 * @author yhn
 * @version 1.0
 * @param <T> 数据类型
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    /**
     * 业务状态码
     */
    private Integer code;
    /**
     * 业务信息
     */
    private String message;
    /**
     * 业务数据
     */
    private T data;

    /**
     * 带参成功方法
     * @param msg 业务信息
     * @param data 业务数据
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> success(String msg,T data) {
        return new Result<>(ResultStatus.SUCCESS.getCode(), msg, data);
    }

    /**
     * 带参成功方法
     * @param msg 业务信息
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> success(String msg) {
        return new Result<>(ResultStatus.SUCCESS.getCode(), msg, null);
    }

    /**
     * 带参成功方法
     * @param data 业务数据
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> success(T data){
        return new Result<>(ResultStatus.SUCCESS.getCode(), ResultStatus.SUCCESS.getMsg(), data);
    }

    /**
     * 带参成功方法
     * @param code 业务码
     * @param msg 业务消息
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> success(Integer code, String msg){ return new Result<>(code, msg, null);}

    /**
     * 带参成功方法
     * @param code 业务码
     * @param msg 业务消息
     * @param data 业务数据
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> success(Integer code, String msg,T data){ return new Result<>(code, msg, data);}
    /**
     * 带参失败方法
     * @param msg 业务信息
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> fail(String msg){
        return new Result<>(ResultStatus.FAIL.getCode(), msg, null);
    }

    /**
     * 带参失败方法
     * @param msg 业务信息
     * @param data 业务数据
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> fail(String msg,T data){
        return new Result<>(ResultStatus.FAIL.getCode(), msg, data);
    }

    /**
     * 带参失败方法
     * @param code 错误码
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> fail(Integer code, String msg){
        return new Result<>(code, msg, null);
    }

    /**
     * 带参失败方法
     * @param code 错误码
     * @param msg 错误信息
     * @param data 业务数据
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> fail(Integer code, String msg,T data){ return new Result<>(code, msg, data);}

    /**
     * 带参失败方法
     * @param data 业务数据
     * @param <T> 数据类型
     * @return 结果
     */
    public static <T> Result<T> fail(T data){
        return new Result<>(ResultStatus.FAIL.getCode(), ResultStatus.FAIL.getMsg(), data);
    }
    /**
     * 无参成功方法
     * @return 结果
     */
    public static Result<?> success(){
        return new Result<>(ResultStatus.SUCCESS.getCode(), ResultStatus.SUCCESS.getMsg(), null);
    }

    /**
     * 无参失败方法
     * @return 结果
     */
    public static Result<?> fail(){
        return new Result<>(ResultStatus.FAIL.getCode(), ResultStatus.FAIL.getMsg(), null);
    }
}

